package com.liming.order.client;

import com.liming.common.pojo.dto.order.user.UserOrderDTO;
import com.liming.common.pojo.dto.order.user.mini.MiniOrderQueryPage;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.order.OrderVO;
import com.liming.common.pojo.vo.order.mini.MiniOrderItemVO;
import com.liming.common.pojo.vo.order.mini.MiniOrderVO;
import com.liming.service.wx.pojo.vo.PrepayVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * @author liming
 * @date 2025/1/2
 */
@FeignClient(value = "order-service", contextId = "userOrderClient", path = "/service/user-order")
public interface UserOrderClient {

    /**
     * 根据订单ID获取订单详情
     *
     * @param id 订单ID
     * @return 订单详情
     */
    @GetMapping("{id}")
    OrderVO detailById(@PathVariable Long id);

    /**
     * 用户下单
     *
     * @param userOrderDTO 用户下单参数
     * @return 是否下单成功
     */
    @PostMapping("createOrder")
    PrepayVO createOrder(@RequestBody UserOrderDTO userOrderDTO);

    /**
     * 获取所有状态订单的数量
     *
     * @return Map<订单状态 ， 订单数量>
     */
    @GetMapping("allStatusCount/{userId}")
    Map<Integer, Integer> allStatusCount(@PathVariable Long userId);

    /**
     * 获取用户的订单
     *
     * @param queryPage 订单查询参数
     * @return 订单分页数据
     */
    @GetMapping
    PageVO<MiniOrderVO> page(@SpringQueryMap MiniOrderQueryPage queryPage);

    /**
     * 根据订单ID获取订单项
     *
     * @param id 订单ID
     * @return List<MiniOrderItemVO>
     */
    @GetMapping("itemsById/{id}")
    List<MiniOrderItemVO> itemsById(@PathVariable Long id);

    /**
     * 根据订单ID列表获取订单的商品ID列表
     *
     * @param keyIdList 订单ID列表
     * @return 商品ID列表
     */
    @PostMapping("productIdListByOrderIdList")
    List<Long> productIdListByOrderIdList(@RequestBody List<Long> keyIdList);

    /**
     * 取消订单 根据订单ID
     *
     * @param id 订单ID
     * @return 取消是否成功
     */
    @PutMapping("cancel/{id}")
    Boolean cancel(@PathVariable Long id);

    /**
     * 完成订单 根据订单ID
     *
     * @param id 订单ID
     * @return 完成是否成功
     */
    @PutMapping("complete/{id}")
    Boolean complete(@PathVariable Long id);

    /**
     * 订单支付成功 调用（回调）接口
     *
     * @param id 订单ID
     * @return 内部操作是否成功
     */
    @PutMapping("createOrderPaySuccess/{id}")
    Boolean createOrderPaySuccess(@PathVariable Long id);
}
